//  创建用户相关的小仓库
import { defineStore } from 'pinia';
// 引入登入接口
import { reqLogin, reqUserInfo, reqLogout } from '@/api/users';
// 引入数据类型
import type { loginFormData, loginResponseData, userInfoReponseData } from '@/api/users/type';

import type { UserState } from '@/store/modules/types/type';

import { SET_TOKEN, GET_TOKEN, REMOVE_TOKEN } from '@/utils/token';

import { constantRoute } from '@/router/routes';

// 创建用户小仓库
let useUserStore = defineStore('User', {
    // 小仓库存储数据的地方

    state: (): UserState => {
        return {
            token: GET_TOKEN(), //用户的唯一标识
            menuRoutes: constantRoute,
            username: '',
            avatar: '',
            buttons:[]
        }
    },
    // 异步|逻辑的地方
    actions: {
        // 用户登入的方法
        async userLogin(data: loginFormData) {
            console.log('pinia 触发了登入请求 =======>', data)
            // 发送登入请求
            let result: loginResponseData = await reqLogin(data)
            // 登入成功 200 -> token
            // 登入失败 201 -> 登入失败的信息
            if (result.code == 200) {
                console.log("获取登入成功的数据====", result)
                // 由于 pinia | vuex 存储的数据其实是利用的 js 对象
                // 本地持久化一份数据
                this.token = (result.data.access_token as string);
                SET_TOKEN(result.data.access_token as string)
                //能保证当前async函数返回一个成功的promise
                return 'ok';
            } else {
                return Promise.reject(new Error(result.message));
            }
        },


        //获取用户信息方法 
        async userInfo() {
            //获取用户信息进行存储仓库当中[用户头像、名字]
            let result: userInfoReponseData = await reqUserInfo();

            console.log("获取用户的详情为===>", result)
            //如果获取用户信息成功，存储一下用户信息
            if (result.code == 200) {
                this.username = result.data.username;
                this.avatar = result.data.avatar;
                this.buttons = result.data.buttons;
                return 'ok';
            } else {
                return Promise.reject(new Error(result.data.message));
            }
        },


        //退出登录 
        async userLogout() {
            //退出登录请求
            // let result: any = await reqLogout(); 退出接口不存在所以先写死
            if (true) {
                //目前没有mock接口:退出登录接口(通知服务器本地用户唯一标识失效)
                this.token = '';
                this.username = '';
                this.avatar = '';
                REMOVE_TOKEN();
                return 'ok';
            } else {
                return Promise.reject(new Error(result.message));
            }

        },



    },
    getters: {


    }

})

// 对外暴露获取小仓库
export default useUserStore;
